home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / whdload / src / sources / strings.i < prev   
Text File  |  2000-02-28  |  9KB  |  448 lines

  1.  IFND    STRINGS_I
  2. STRINGS_I = 1
  3. ;*---------------------------------------------------------------------------
  4. ;  :Author.    Bert Jahn
  5. ;  :Contens.    macros for processing strings
  6. ;  :EMail.    wepl@kagi.com
  7. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  8. ;  :Version.    $Id: strings.i 1.3 1999/06/24 23:13:31 jah Exp jah $
  9. ;  :History.    29.12.95 separated from WRip.asm
  10. ;        18.01.96 IFD Label replaced by IFD Symbol
  11. ;             because Barfly optimize problems
  12. ;        02.03.96 _RemoveExtension,_AppendString added
  13. ;        25.08.96 _atoi,_etoi added
  14. ;        21.07.97 _StrLen added
  15. ;        22.07.97 Macro UPPER separated from whdl_cache.s
  16. ;        22.07.97 _StrNCaseCmp added
  17. ;        16.11.97 buffer length check fixed in _FormatString,
  18. ;             now works, but it is no longer reentrant !
  19. ;        21.12.97 _DoStringNull added
  20. ;        27.06.98 cleanup for use with "HrtMon"
  21. ;        17.10.98 parameters for _AppendString corrected
  22. ;  :Copyright.    This program is free software; you can redistribute it and/or
  23. ;        modify it under the terms of the GNU General Public License
  24. ;        as published by the Free Software Foundation; either version 2
  25. ;        of the License, or (at your option) any later version.
  26. ;        This program is distributed in the hope that it will be useful,
  27. ;        but WITHOUT ANY WARRANTY; without even the implied warranty of
  28. ;        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  29. ;        GNU General Public License for more details.
  30. ;        You can find the full GNU GPL online at: http://www.gnu.org
  31. ;  :Language.    68000 Assembler
  32. ;  :Translator.    Barfly 2.9
  33. ;---------------------------------------------------------------------------*
  34. *##
  35. *##    strings.i
  36. *##
  37. *##    _FormatString    fmt(a0),argarray(a1),buffer(a2),bufsize(d0)
  38. *##    _DoStringNull    list(a0),number(d0.w) --> stringptr(d0)
  39. *##    _DoString    list(a0),number(d0.w) --> stringptr(d0)
  40. *##    _CopyString    source(a0),dest(a1),destbufsize(d0) --> success(d0)
  41. *##    _RemoveExtension source(a0) --> success(d0)
  42. *##    _AppendString    source(a0),dest(a1),destbufsize(d0) --> success(d0)
  43. *##    _atoi        source(a0) --> integer(d0),stringleft(a0)
  44. *##    _etoi        source(a0) --> integer(d0),stringleft(a0)
  45. *##    UPPER        char(dx) --> char(dx)
  46. *##    _StrLen        source(a0) --> length(d0)
  47. *##    _StrNCaseCmp    string(a0),string(a1),len(d0) --> relation(d0)
  48.  
  49.     dc.b    "$Id: strings.i 1.3 1999/06/24 23:13:31 jah Exp jah $"
  50.     EVEN
  51.  
  52. ;----------------------------------------
  53. ; Formatiert String (printf)
  54. ; Übergabe :    D0 = ULONG Länge des Buffers
  55. ;        A0 = APTR FormatString
  56. ;        A1 = APTR Argumente
  57. ;        A2 = Buffer
  58. ; Rückgabe :    -
  59.  
  60. FormatString    MACRO
  61.     IFND    FORMATSTRING
  62. FORMATSTRING=1
  63.         IFND    _LVORawDoFmt
  64.             INCLUDE lvo/exec.i
  65.         ENDC
  66. _FormatString    movem.l    a2-a3/a6,-(a7)
  67.         lea    (.bufend),a3
  68.         add.l    a2,d0
  69.         move.l    d0,(a3)
  70.         move.l    a2,a3
  71.         lea    (.PutChar),a2
  72.         move.l    (gl_execbase,GL),a6
  73.         jsr    (_LVORawDoFmt,a6)
  74.         movem.l    (a7)+,a2-a3/a6
  75.         rts
  76.  
  77. .PutChar    move.b    d0,(a3)+
  78.         cmp.l    (.bufend),a3
  79.         bne    .PC_ok
  80.         subq.l    #1,a3
  81. .PC_ok        rts    
  82.  
  83. .bufend        dc.l    0
  84.     ENDC
  85.         ENDM
  86.  
  87. ;----------------------------------------
  88. ; Berechnet String-Adresse über Zuordungstabelle
  89. ; Übergabe :    D0 = WORD   value
  90. ;        A0 = STRUCT Zuordnungstabelle
  91. ; Rückgabe :    D0 = CPTR   string or NULL
  92.  
  93. DoStringNull    MACRO
  94.     IFND    DOSTRINGNULL
  95. DOSTRINGNULL=1
  96. _DoStringNull
  97. .start        cmp.w    (a0),d0            ;lower bound
  98.         blt    .nextlist
  99.         cmp.w    (2,a0),d0        ;upper bound
  100.         bgt    .nextlist
  101.         move.w    d0,d1
  102.         sub.w    (a0),d1            ;index
  103.         add.w    d1,d1            ;because words
  104.         move.w    (8,a0,d1.w),d1        ;rptr
  105.         beq    .nextlist
  106.         add.w    d1,a0
  107.         move.l    a0,d0
  108.         rts
  109.  
  110. .nextlist    move.l    (4,a0),a0        ;next list
  111.         move.l    a0,d1
  112.         bne    .start
  113.         
  114.         moveq    #0,d0
  115.         rts
  116.  
  117.         ENDC
  118.         ENDM
  119.  
  120. ;----------------------------------------
  121. ; Berechnet String-Adresse über Zuordungstabelle (data not reetrant !)
  122. ; Übergabe :    D0 = WORD   value
  123. ;        A0 = STRUCT Zuordnungstabelle
  124. ; Rückgabe :    D0 = CPTR   string
  125.  
  126. DoString    MACRO
  127.     IFND    DOSTRING
  128. DOSTRING=1
  129.         IFND    DOSTRINGNULL
  130.             DoStringNull
  131.         ENDC
  132.         IFND    FORMATSTRING
  133.             FormatString
  134.         ENDC
  135.  
  136. _DoString    ext.l    d0
  137.         movem.l    d0/a2,-(a7)
  138.         bsr    _DoStringNull
  139.         tst.l    d0
  140.         beq    .maketxt
  141.         addq.l    #8,a7
  142.         rts
  143.  
  144. .maketxt        move.l    a7,a1            ;args
  145.         moveq    #8,d0            ;buflen
  146.         lea    (.fmt),a0        ;format string
  147.         lea    (.buf),a2        ;buffer
  148.         bsr    _FormatString
  149.         move.l    a2,d0
  150.         addq.l    #4,a7
  151.         move.l    (a7)+,a2
  152.         rts
  153.  
  154. .fmt        dc.b    "%ld",0
  155. .buf        ds.w    4,0
  156.  
  157.         ENDC
  158.         ENDM
  159.  
  160. ;----------------------------------------
  161. ; Kopiert String
  162. ; Übergabe :    D0 = LONG dest buffer size
  163. ;        A0 = CPTR  source string
  164. ;        A1 = APTR  dest buffer
  165. ; Rückgabe :    D0 = LONG  success (fail if buffer to small)
  166.  
  167. CopyString    MACRO
  168.     IFND    COPYSTRING
  169. COPYSTRING=1
  170. _CopyString    tst.l    d0
  171.         ble    .err
  172. .lp        move.b    (a0)+,(a1)+
  173.         beq    .ok
  174.         subq.l    #1,d0
  175.         bne    .lp
  176.         clr.b    -(a1)
  177. .err        moveq    #0,d0
  178.         rts
  179.  
  180. .ok        moveq    #-1,d0
  181.         rts
  182.     ENDC
  183.         ENDM
  184.  
  185. ;----------------------------------------
  186. ; Entfernt Endung
  187. ; Übergabe :    A0 = CPTR  source string
  188. ; Rückgabe :    D0 = LONG  success (true if a extension is removed)
  189.  
  190. RemoveExtension    MACRO
  191.     IFND    REMOVEEXTENSION
  192. REMOVEEXTENSION=1
  193. _RemoveExtension
  194.         move.l    a0,d0
  195.         beq    .err
  196. .l1        tst.b    (a0)+
  197.         bne    .l1
  198. .l2        cmp.l    a0,d0
  199.         beq    .err
  200.         cmp.b    #".",-(a0)
  201.         bne    .l2
  202.         clr.b    (a0)
  203.         moveq    #-1,d0
  204.         rts
  205.         
  206. .err        moveq    #0,d0
  207.         rts
  208.     ENDC
  209.         ENDM
  210.  
  211. ;----------------------------------------
  212. ; Hängt String hinten an
  213. ; IN:    D0 = LONG  destination buffer size
  214. ;    A0 = CPTR  source string (to append)
  215. ;    A1 = CPTR  destination string (to append on)
  216. ; OUT:    D0 = LONG  success (fail if buffer to small)
  217.  
  218. AppendString    MACRO
  219.     IFND    APPENDSTRING
  220. APPENDSTRING=1
  221. _AppendString    tst.l    d0
  222.         ble    .err
  223. .l1        subq.l    #1,d0
  224.         tst.b    (a1)+
  225.         bne    .l1
  226.         subq.l    #1,a1
  227.         addq.l    #1,d0
  228.         ble    .err
  229.         
  230. .lp        move.b    (a0)+,(a1)+
  231.         beq    .ok
  232.         subq.l    #1,d0
  233.         bne    .lp
  234.         clr.b    -(a1)
  235.  
  236. .err        moveq    #0,d0
  237.         rts
  238.  
  239. .ok        moveq    #-1,d0
  240.         rts
  241.     ENDC
  242.         ENDM
  243.  
  244. ;----------------------------------------
  245. ; Umwandlung ASCII to Integer
  246. ; asciiint ::= [+|-] { {<digit>} | ${<hexdigit>} }¹
  247. ; hexdigit ::= {012456789abcdefABCDEF}¹
  248. ; digit    ::= {0123456789}¹
  249. ; Übergabe :    A0 = CPTR ascii | NIL
  250. ; Rückgabe :    D0 = LONG integer (on error=0)
  251. ;        A0 = CPTR first char after translated ASCII
  252.  
  253. atoi        MACRO
  254.     IFND    ATOI
  255. ATOI=1
  256. _atoi        movem.l    d6-d7,-(a7)
  257.         moveq    #0,d0        ;default
  258.         move.l    a0,d1        ;a0 = NIL ?
  259.         beq    .eend
  260.         moveq    #0,d1
  261.         move.b    (a0)+,d1
  262.         cmp.b    #"-",d1
  263.         seq    d7        ;D7 = negative
  264.         beq    .1p
  265.         cmp.b    #"+",d1
  266.         bne    .base
  267. .1p        move.b    (a0)+,d1
  268. .base        cmp.b    #"$",d1
  269.         beq    .hexs
  270.  
  271. .dec        cmp.b    #"0",d1
  272.         blo    .end
  273.         cmp.b    #"9",d1
  274.         bhi    .end
  275.         sub.b    #"0",d1
  276.         move.l    d0,d6        ;D0 * 10
  277.         lsl.l    #3,d0        ;
  278.         add.l    d6,d0        ;
  279.         add.l    d6,d0        ;
  280.         add.l    d1,d0
  281.         move.b    (a0)+,d1
  282.         bra    .dec
  283.  
  284. .hexs        move.b    (a0)+,d1
  285. .hex        cmp.b    #"0",d1
  286.         blo    .hexl
  287.         cmp.b    #"9",d1
  288.         bhi    .hexl
  289.         sub.b    #"0",d1
  290.         bra    .hexgo
  291. .hexl        cmp.b    #"a",d1
  292.         blo    .hexh
  293.         cmp.b    #"f",d1
  294.         bhi    .hexh
  295.         sub.b    #"a"-10,d1
  296.         bra    .hexgo
  297. .hexh        cmp.b    #"A",d1
  298.         blo    .end
  299.         cmp.b    #"F",d1
  300.         bhi    .end
  301.         sub.b    #"A"-10,d1
  302. .hexgo        lsl.l    #4,d0        ;D0 * 16
  303.         add.l    d1,d0
  304.         move.b    (a0)+,d1
  305.         bra    .hex
  306.  
  307. .end        subq.l    #1,a0
  308.         tst.b    d7
  309.         beq    .eend
  310.         neg.l    d0
  311. .eend        movem.l    (a7)+,d6-d7
  312.         rts
  313.     ENDC
  314.         ENDM
  315.  
  316. ;----------------------------------------
  317. ; Umwandlung Expression to Integer
  318. ; asiiexp ::= {<space>} <asciiint> { {<space>} {+|-}¹ {<space>} <asciiint> }
  319. ; space   ::= {SPACE|TAB}
  320. ; Übergabe :    A0 = CPTR ascii | NIL
  321. ; Rückgabe :    D0 = LONG integer (on error=0)
  322. ;        A0 = CPTR first char after translated ASCII
  323.  
  324. etoi        MACRO
  325.     IFND    ETOI
  326.     IFND    ATOI
  327.         atoi
  328.     ENDC
  329. ETOI=1
  330. _etoi        movem.l    d2-d3,-(a7)
  331.         moveq    #0,d2        ;D2 = result
  332.         move.l    a0,d1        ;a0 = NIL ?
  333.         beq    .eend
  334.         moveq    #0,d3        ;D3 = operation
  335.  
  336. .sp        move.b    (a0)+,d1
  337.         cmp.b    #" ",d1        ;space
  338.         beq    .sp
  339.         cmp.b    #"    ",d1    ;tab
  340.         beq    .sp
  341.         subq.l    #1,a0
  342.         bsr    _atoi
  343.         cmp.b    #"-",d3
  344.         beq    .minus
  345. .plus        add.l    d0,d2
  346.         bra    .newop
  347. .minus        sub.l    d0,d2
  348. .newop        move.b    (a0)+,d1
  349.         cmp.b    #" ",d1        ;space
  350.         beq    .newop
  351.         cmp.b    #"    ",d1    ;tab
  352.         beq    .newop
  353.         cmp.b    #"+",d1
  354.         beq    .opok
  355.         cmp.b    #"-",d1
  356.         bne    .end
  357. .opok        move.b    d1,d3        ;D3 = operation
  358.         bra    .sp
  359.  
  360. .end        subq.l    #1,a0
  361. .eend        move.l    d2,d0
  362.         movem.l    (a7)+,d2-d3
  363.         rts
  364.     ENDC
  365.         ENDM
  366.  
  367. ;----------------------------------------
  368. ; calculate length of a string
  369. ; (confirming BSD 4.3)
  370. ; IN :    A0 = CPTR  source string
  371. ; OUT :    D0 = ULONG length
  372.  
  373. StrLen    MACRO
  374.     IFND    STRLEN
  375. STRLEN=1
  376. _StrLen        moveq    #0,d0        ;length
  377.         move.l    a0,d1
  378.         beq    .end
  379. .loop        tst.b    (a0)+
  380.         beq    .end
  381.         addq.l    #1,d0
  382.         bra    .loop
  383. .end        rts
  384.     ENDC
  385.         ENDM
  386.  
  387. ;----------------------------------------
  388. ; makes character in Dx upper case
  389. ; only 7-bit ASCII !
  390.  
  391. UPPER    MACRO
  392.         cmp.b    #"a",\1
  393.         blo    .l\@
  394.         cmp.b    #"z",\1
  395.         bhi    .l\@
  396.         sub.b    #$20,\1
  397. .l\@
  398.     ENDM
  399.  
  400. ;----------------------------------------
  401. ; compare two strings with given length case insensitiv (only 7-bit ASCII !!!)
  402. ; (confirming BSD 4.3)
  403. ; IN :    D0 = ULONG amount of chars to compare
  404. ;    A0 = CPTR  string 1
  405. ;    A1 = CPTR  string 2
  406. ; OUT :    D0 = ULONG <0 if a0 less than a1
  407. ;            0 if a0 equal a1
  408. ;           >0 if a0 greater than a1
  409.  
  410. StrNCaseCmp    MACRO
  411.     IFND    STRNCASECMP
  412. STRNCASECMP=1
  413. _StrNCaseCmp    move.l    d2,-(a7)
  414.  
  415.         tst.l    d0        ;len = 0 ?
  416.         beq    .equal
  417.         cmp.l    a0,a1        ;string equal ?
  418.         beq    .equal
  419.         move.l    a0,d1
  420.         beq    .less
  421.         move.l    a1,d1
  422.         beq    .greater
  423.         
  424. .next        move.b    (a0)+,d1
  425.         UPPER    d1
  426.         move.b    (a1)+,d2
  427.         UPPER    d2
  428.         cmp.b    d1,d2
  429.         bhi    .less
  430.         blo    .greater
  431.         subq.l    #1,d0
  432.         bne    .next
  433.  
  434. .equal        moveq    #0,d0
  435.         bra    .end
  436. .less        moveq    #-1,d0
  437.         bra    .end
  438. .greater    moveq    #1,d0
  439. .end        move.l    (a7)+,d2
  440.         rts
  441.     ENDC
  442.         ENDM
  443.  
  444. ;---------------------------------------------------------------------------
  445.  
  446.     ENDC
  447.  
  448.